package com.test.scope;

import java.util.HashMap;
import java.util.Map;

/**
 * 实现了Scope接口的PrototypeScope类，用于管理原型（prototype）作用域的Bean
 */
public class PrototypeScope implements Scope{

    /**
     * 存储销毁回调函数的映射表，键为Bean名称，值为Bean的销毁回调函数
     */
    private final Map<String, Runnable> destructionCallbacks = new HashMap<>(16);

    /**
     * 获取Bean实例的方法
     *
     * @param name Bean的名称
     * @param objectFactory ObjectFactory实例，用于创建Bean
     * @return 返回创建的Bean实例
     * @throws Exception 如果创建Bean过程中发生异常，则抛出
     */
    @Override
    public Object get(String name, ObjectFactory<?> objectFactory) {
        try{
            return objectFactory.getObject();
        }catch (Exception e){
            throw e;
        }
    }

    /**
     * 移除指定名称的Bean
     *
     * @param name 要移除的Bean的名称
     * @return 返回null，表示已移除Bean
     */
    @Override
    public Object remove(String name) {
        this.destructionCallbacks.remove(name);
        return null;
    }

    /**
     * 注册Bean的销毁回调函数
     *
     * @param name Bean的名称
     * @param callback Bean的销毁回调函数
     */
    @Override
    public void registerDestructionCallback(String name, Runnable callback) {
        this.destructionCallbacks.put(name, callback);
    }

    /**
     * 获取会话标识符，对于原型作用域来说，返回"prototype"
     *
     * @return 返回字符串"prototype"，表示原型作用域
     */
    @Override
    public String getConversationId() {
        return "prototype";
    }

    /**
     * 销毁所有原型Bean，通过调用注册的销毁回调函数
     */
    public void destroyPrototypes(){
        String[] prototypeNames = this.destructionCallbacks.keySet().toArray(new String[0]);
        for (String name : prototypeNames) {
            Runnable callback = this.destructionCallbacks.remove(name);
            if (callback != null) {
                try {
                    callback.run();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
}
